package coms;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import java.util.Random;

// 标记为切面类 + Spring组件
@Aspect
@Component
public class OrderAspect {

    // ========== 切点定义 ==========
    // 匹配OrderService接口的所有方法
    @Pointcut("execution(* coms.OrderService.*(..))")
    public void allMethods() {}

    // 仅匹配add和delete方法
    @Pointcut("execution(* coms.OrderService.add(..)) || execution(* coms.OrderService.delete(..))")
    public void addDeleteMethods() {}


    // ========== 1. 前置增强（所有方法） ==========
    @Before("allMethods()")
    public void beforeAdvice(JoinPoint joinPoint) {
        System.out.println("[前置增强] hello, 我是一个前置增强（方法：" + joinPoint.getSignature().getName() + "）");
    }


    // ========== 2. 后置增强（仅add/delete） ==========
    @AfterReturning("addDeleteMethods()")
    public void afterAdvice(JoinPoint joinPoint) {
        System.out.println("[后置增强] bye, 我是一个后置增强（方法：" + joinPoint.getSignature().getName() + "）");
    }


    // ========== 3. 获取返回值（所有方法） ==========
    @AfterReturning(pointcut = "allMethods()", returning = "result")
    public void logReturnValue(JoinPoint joinPoint, Object result) {
        System.out.println("[返回值增强] 方法 " + joinPoint.getSignature().getName() + " 的返回值：" + result);
    }


    // ========== 4. 计算执行时间（所有方法） ==========
    @Around("allMethods()")
    public Object calculateTime(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();
        Object result = joinPoint.proceed(); // 执行目标方法
        long end = System.currentTimeMillis();
        System.out.println("[执行时间增强] 方法 " + joinPoint.getSignature().getName() + " 耗时：" + (end - start) + "ms");
        return result;
    }


    // ========== 5. 权限校验（仅add/delete） ==========
    @Around("addDeleteMethods()")
    public Object checkPermission(ProceedingJoinPoint joinPoint) throws Throwable {
        int permission = new Random().nextInt(2); // 0：有权限，1：无权限
        String method = joinPoint.getSignature().getName();

        if (permission == 0) {
            System.out.println("[权限校验] 有权限，执行 " + method + " 方法");
            return joinPoint.proceed(); // 执行目标方法
        } else {
            System.out.println("[权限校验] 无权限，终止 " + method + " 方法");
            return null; // 终止执行
        }
    }
}
